package Model;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "produto")
public class Produto implements Serializable {

    @Id
    @SequenceGenerator(name = "cod_produto", sequenceName = "cod_produto_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_produto")
    @Column(name = "cod_produto", nullable = false)
    private int codProduto;
    @Column(name = "nome")
    private String nome;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "cod_classificacao")
    private Classificacao classificacao;
    @ManyToOne(fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name = "cod_variedade")
    private Variedade variedade;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "produto")
    @Fetch(FetchMode.SELECT)
    @Cascade(CascadeType.LOCK)
    private Collection<ItemPedidoEmpresa> itemPedidoEmpresa;
    @OneToMany(mappedBy = "produto", fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @Cascade(CascadeType.LOCK)
    private Collection<ItemPrevisao> itemPrevisao;

    //Construtores
    //Construtor padrao
    public Produto() {
        this.codProduto = 0;
        this.classificacao = new Classificacao();
        this.variedade = new Variedade();
        this.nome = "";
    }

    public Produto(Integer codigo) {
        this.codProduto = codigo;
    }
    //Contrutor com parametros

    public Produto(int codProduto, String nome, Classificacao classificacao, Variedade variedade) {
        this.codProduto = codProduto;
        this.nome = variedade.getNome() + " " + classificacao.getNome();
        this.classificacao = classificacao;
        this.variedade = variedade;
    }

    //Metodos get e set
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getCodProduto() {
        return codProduto;
    }

    public void setCodProduto(int codProduto) {
        this.codProduto = codProduto;
    }

    public Classificacao getClassificacao() {
        return classificacao;
    }

    public void setClassificacao(Classificacao classificacao) {
        this.classificacao = classificacao;
    }

    public Variedade getVariedade() {
        return variedade;
    }

    public void setVariedade(Variedade variedade) {
        this.variedade = variedade;
    }

    public Collection<ItemPedidoEmpresa> getItemPedidoEmpresa() {
        return itemPedidoEmpresa;
    }

    public void setItemPedidoEmpresa(Collection<ItemPedidoEmpresa> itemPedidoEmpresa) {
        this.itemPedidoEmpresa = itemPedidoEmpresa;
    }

    public Collection<ItemPrevisao> getItemPrevisao() {
        return itemPrevisao;
    }

    public void setItemPrevisao(Collection<ItemPrevisao> itemPrevisao) {
        this.itemPrevisao = itemPrevisao;
    }

    public List<ItemPrevisao> retornaPorData(Date data){
        List<ItemPrevisao> lista=(List<ItemPrevisao>) getItemPrevisao();
        for(int i=0;i<getItemPrevisao().size();i++){
            if((lista.get(i).getPrevisao().getDataFim().after(data))||(lista.get(i).getPrevisao().getDataFim().before(data))){
                lista.remove(lista.get(i));
                i--;
            }
            if(lista.get(i).getQuantidadeAuxiliar()==0){
                lista.remove(i);
            }
        }
        return lista;
    }
    
}
